package main

import (
	"fmt"
	"gitee.com/libbylg/pkgr/repo"
	"strings"
)

type CmdInstallOption struct {
	Force bool   // 强制安装
	Label string // 待安装的模块的标签
	//Recursive bool   // 是否安装依赖模块
}

// NewCmdInstallOption 识别命令行选项.
// pkgr install   LABEL
func NewCmdInstallOption(argv []string) (*CmdInstallOption, error) {
	// 检查参数数量
	if len(argv) < 3 {
		return nil, fmt.Errorf("the required parameter is missing, try -h for help")
	}

	// 初始化默认值
	opt := &CmdInstallOption{
		Force: false,
		Label: "",
		//Recursive: false,
	}

	// 读取选项
	for index := 2; index < len(argv); index++ {
		//if argv[index] == "-r" || argv[index] == "--recursive" {
		//	opt.Recursive = true
		//	continue
		//}

		// 遇到无法识别的选项
		if strings.HasPrefix(argv[index], "-") {
			return nil, fmt.Errorf("unsupported options `%v'", argv[index])
		}

		// 识别 PATTERN 参数
		if len(opt.Label) == 0 {
			opt.Label = argv[index]
			continue
		}

		return nil, fmt.Errorf("unsupported option `%v'", argv[index])
	}

	return opt, nil
}

// CmdInstall 安装指定的模块
// thpkg install LABEL
func CmdInstall(argv []string) int {
	opt, err := NewCmdInstallOption(argv)
	if err != nil {
		ERROR("Load option for `%v' failed: %v", "install", err.Error())
		return 1
	}

	//// 读取模块版本描述
	//description, err := repo.ReadModuleVersionDescription(opt.Label)
	//if err != nil {
	//	ERROR("Invalid module label `%v': %v", opt.Label, err.Error())
	//	return 1
	//}

	if repo.IsInstalledLabel(opt.Label) {
		//INFOR("Install `%v' success, it is installed, just skip", opt.Label)
		return 0
	}

	//// 如果指定支持递归，那么先安装依赖的模块
	//if opt.Recursive {
	//	// 先把依赖树构造出来
	//	rootTree, err := repo.BuildDependencyTree(opt.Label)
	//	if err != nil {
	//		ERROR("Build dependency tree for `%v' failed: %v", opt.Label, err)
	//		return 1
	//	}
	//
	//	// 创建一个已经扫描的项的登记表
	//	scannedItems := make(map[string]bool)
	//	uninstalledItems := make([]string, 0, 100)
	//	repo.EnumDependencyTree(0, rootTree, func(depth int, tree *repo.DependencyTree) bool {
	//		// 确定下是否已经扫描过了，如果已经扫描过了，没必要重新扫描一次
	//		_, scanned := scannedItems[tree.Label]
	//		if scanned {
	//			return false
	//		}
	//
	//		// 如果未扫描到
	//		scannedItems[tree.Label] = true
	//		return true
	//	}, func(depth int, tree *repo.DependencyTree) {
	//		uninstalledItems = append(uninstalledItems, tree.Label)
	//	})
	//
	//	// 先将自己删除这样可以将所有依赖项提取出来
	//	delete(scannedItems, opt.Label)
	//
	//	for _, reqLabel := range uninstalledItems {
	//		if repo.IsInstalledLabel(reqLabel) {
	//			continue
	//		}
	//
	//		if err := repo.Install(reqLabel); err != nil {
	//			ERROR("Install required module `%v' failed: %v", reqLabel, err)
	//			return 1
	//		}
	//	}
	//}

	//if len(installFailedItems) > 0 {
	//	INFOR("Install `%v' failed, some required module install failed:", opt.Label)
	//	for _, failItem := range installFailedItems {
	//		INFOR("    * %v", failItem)
	//	}
	//	return 1
	//}

	if err := repo.Install(opt.Label); err != nil {
		ERROR("Install `%v' failed", opt.Label)
		return 1
	}

	INFOR("Install module `%v' success", opt.Label)
	return 0
}
